package gov.pr.celepar.sentinela.admin.action;

import java.util.Collection;
import java.util.Iterator;

import gov.pr.celepar.sentinela.admin.dao.SistemaDAO;
import gov.pr.celepar.sentinela.admin.dao.factory.DAOFactoryServer;
import gov.pr.celepar.sentinela.admin.excecao.SentinelaServerException;
import gov.pr.celepar.sentinela.admin.form.BloqueioUsuarioForm;
import gov.pr.celepar.sentinela.admin.pojo.Usuario;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;

public class BloqueioUsuarioAction extends BaseAction {
	private static Log logger = LogFactory.getLog(BloqueioUsuarioAction.class);

	public String executar(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws SentinelaServerException, Exception {
		listarSistemasAutorizados(request);
		BloqueioUsuarioForm bloqueioUsuarioForm = (BloqueioUsuarioForm) form;

		if (this.CONF_ALTERAR.equalsIgnoreCase(bloqueioUsuarioForm.getAcao())) {
			this.comunicacao.autorizaOperacao('A', request, response);
			consultar(bloqueioUsuarioForm, request);
			alterar(bloqueioUsuarioForm, request);
		}
		if (bloqueioUsuarioForm.getCodSistema() != null
				&& !bloqueioUsuarioForm.getCodSistema().equals(""))
			consultar(bloqueioUsuarioForm, request);

		return "lista_usuariosBloqueados";
	}

	private void alterar(BloqueioUsuarioForm form, HttpServletRequest request)
			throws SentinelaServerException {
		DAOFactoryServer daoFactory = DAOFactoryServer.getDAOFactory();
		SistemaDAO sistemaB = daoFactory.getSistemaDAO();

		String codUsuariosBloqueados[] = form.getCodUsuariosBloqueados();
		String codUsuariosNaoBloaqueados[] = form.getCodUsuariosNaoBloqueados();

		Collection bloqueados = (Collection) request
				.getAttribute("listaUsuariosBloqueados");
		Collection naoBloqueados = (Collection) request
				.getAttribute("listaUsuariosNaoBloqueados");

		Long bloqueadosForm[] = null;
		Long naoBloqueadosForm[] = null;
		Long bloqueadosBanco[] = null;
		Long naoBloqueadosBanco[] = null;

		if (codUsuariosBloqueados != null) {
			bloqueadosForm = new Long[codUsuariosBloqueados.length];
			for (int i = 0; i < codUsuariosBloqueados.length; i++) {
				try {
					bloqueadosForm[i] = Long.decode(codUsuariosBloqueados[i]);
				} catch (NumberFormatException e) {
					logger.error("", e);
				}
			}
		} else {
			bloqueadosForm = new Long[0];
		}

		if (codUsuariosNaoBloaqueados != null) {
			naoBloqueadosForm = new Long[codUsuariosNaoBloaqueados.length];
			for (int i = 0; i < codUsuariosNaoBloaqueados.length; i++) {
				try {
					naoBloqueadosForm[i] = Long
							.decode(codUsuariosNaoBloaqueados[i]);
				} catch (NumberFormatException e) {
					logger.error("", e);
				}
			}
		} else {
			naoBloqueadosForm = new Long[0];
		}

		if (bloqueados != null) {
			bloqueadosBanco = new Long[bloqueados.size()];
			Iterator it = bloqueados.iterator();
			int i = 0;
			while (it.hasNext())
				bloqueadosBanco[i++] = ((Usuario) it.next()).getCodUsuario();
		} else {
			bloqueadosBanco = new Long[0];
		}

		if (naoBloqueados != null) {
			naoBloqueadosBanco = new Long[naoBloqueados.size()];
			Iterator it = naoBloqueados.iterator();
			int i = 0;
			while (it.hasNext())
				naoBloqueadosBanco[i++] = ((Usuario) it.next()).getCodUsuario();
		} else {
			naoBloqueadosBanco = new Long[0];
		}

		for (int i = 0; i < bloqueadosBanco.length; i++) {
			boolean encontrou = false;
			for (int j = 0; j < bloqueadosForm.length; j++) {
				if (bloqueadosBanco[i] == bloqueadosForm[j]) {
					encontrou = true;
					break;
				}
			}
			if (!encontrou) {
				try {
					sistemaB.desbloquearUsuario(bloqueadosBanco[i], Long
							.decode(form.getCodSistema()));
				} catch (SentinelaServerException e) {
					throw e;
				} catch (Exception e) {
					throw new SentinelaServerException(
							"Erro ao Desbloquear usuário do Sistema!", e);
				}
			}
		}

		for (int i = 0; i < bloqueadosForm.length; i++) {
			boolean encontrou = false;
			for (int j = 0; j < bloqueadosBanco.length; j++) {
				if (bloqueadosForm[i] == bloqueadosBanco[j]) {
					encontrou = true;
					break;
				}
			}
			if (!encontrou) {
				try {
					sistemaB.bloquearUsuario(bloqueadosForm[i], Long
							.decode(form.getCodSistema()));
				} catch (SentinelaServerException e) {
					throw e;
				} catch (Exception e) {
					throw new SentinelaServerException(
							"Erro ao Bloquear usuario ao Sistema!", e);
				}
			}
		}
	}

	public void consultar(BloqueioUsuarioForm form, HttpServletRequest request) {
		DAOFactoryServer daoFactory = DAOFactoryServer.getDAOFactory();
		SistemaDAO sistemaB = daoFactory.getSistemaDAO();

		try {
			// get usuariosBloqueados
			Collection bloqueados;
			bloqueados = sistemaB.getUsuariosBloqueados(Long.decode(form
					.getCodSistema()));

			request.setAttribute("listaUsuariosBloqueados", bloqueados);
		} catch (Exception e) {
			logger.error("", e);
		}

		// get UsuariosNaoBloqueados
		try {
			Collection naoBloqueados;
			naoBloqueados = sistemaB.getUsuariosNaoBloqueados(Long.decode(form
					.getCodSistema()));

			request.setAttribute("listaUsuariosNaoBloqueados", naoBloqueados);
		} catch (Exception e) {
			logger.error("", e);
		}
	}
}
